class Modelo
{
	private int valor ;
	
	public Modelo(){}
	
	public void setValor(int valor) {
		this.valor = valor;
	}
	
	public int getValor() {
		return this.valor;
	}
	
	@Override
	public boolean equals(Object object)
	{
		if(object instanceof Modelo)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@Override
	public String toString()
	{
		return "Objeto modelo. Dados: valor: " + valor;
	}

}

class Teste
{
	public static void main(String[] args)
	{
		System.out.println("Testes com tipo primitivo e operador ==");
		
		int a = 10;
		int b = 10;
		System.out.println("Tipos iguais e valores iguais: " + (a==b));
		
		b = 5;
		System.out.println("Tipos iguais e valores diferentes: " + (a==b));
		
		float A = 10f;
		int B = 10;
		System.out.println("Tipos diferentes e valores iguais: " + (A==B));
		
		B = 5;
		System.out.println("Tipos diferentes e valores diferentes: " + (A==B));
		
		
		System.out.println("Testes com variáveis de referência c/ operador ==");
		Modelo modeloUm = new Modelo();
		Modelo modeloDois = new Modelo();
		
		/* Retorna false pois são duas variáveis de referência que apontam
		 * em tempo de execução para objetos diferentes */
		System.out.println("Duas variáveis de referência recém inicializadas: " + (modeloUm == modeloDois));
		
		/* Só funciona quando sobrescreve o equals() */
		System.out.println("Testando com equals: " + (modeloUm.equals(modeloDois)));
		
		System.out.println("Comparando os valores internos: " + (modeloUm.getValor() == modeloDois.getValor()));
		
		/* Agora funciona, porque passa a apontar para a variável passa a apontar para o mesmo objeto */
		modeloUm = modeloDois;		
		System.out.println("Comparando as mesmas após vinculá-las: " + (modeloUm == modeloDois));
		
		/* Alguns métodos de java.lang.Object */
		System.out.println(modeloUm.toString());
		
		/* retorna classe */
		System.out.println(modeloDois.getClass());
		
		System.out.println(modeloUm.hashCode());
		
		
		/* Vendo as reais referências quando o polimorfismo tá na área */
		Canine cao = new Dog();
		Animal animal = cao;
		System.out.println("Verdadeiro tipo de animal");
		System.out.println(animal.getClass());
		animal.makeNoise();
		
		
		System.out.println(cao.getClass());
		
		
	}
}
